﻿// Cleaning Shifts POJ - 3171.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>

using namespace std;

//https://vjudge.csgrandeur.cn/problem/POJ-3171

/*

约翰农场主的奶牛自出生以来就娇生惯养，现在更是达到了苛刻的地步。它们现在要求自己的牛舍一尘不染。
约翰农场主是最乐于助人的农场主，他别无选择，只能雇佣一些奶牛来打扫牛舍。

农夫约翰有 N（1 <= N <= 10,000）头奶牛愿意打扫卫生。由于灰尘不断落下，奶牛们要求在工作日内持续打扫农场，
工作日从秒数 M 到秒数 E（0 <= M <= E <= 86,399）。请注意，进行清洁的总秒数为 E-M+1。
在任何给定的秒数 M...E，必须至少有一头奶牛在进行清洁。

每头牛都提交了一份工作申请，表示愿意在某个时间间隔 T1...T2（其中 M <= T1 <= T2 <= E）内工作，工资为 S（其中 0 <= S <= 500,000）。
请注意，表示时间间隔为 10...20 的奶牛将工作 11 秒，而不是 10 秒。
农场主约翰必须接受或拒绝每份申请；他不能要求奶牛只工作它所表示时间的一小部分，并获得相应一小部分的工资。

请找出一个时间表，在这个时间表中，工作日的每一秒都至少有一头奶牛工作，并使奶牛的工资总额最小。
输入
第 1 行 三个空格分隔的整数： N、M 和 E。

第 2...N+1 行： 第 i+1 行用三个空格分隔的整数描述奶牛 i 的日程安排： T1、T2 和 S。
输出
第 1 行：一个整数，要么是清洁牛舍所需的最低总工资，要么是-1（如果无法清洁牛舍）。

Sample Input

3 0 4
0 2 3
3 4 2
0 0 1
Sample Output

5

样本说明：

FJ 有三头牛，牛舍需要从第 0 秒到第 4 秒打扫。第一头奶牛愿意在第 0 秒、第 1 秒和第 2 秒期间工作，工资总额为 3 等。

农场主约翰可以雇用前两头奶牛。
*/

const int N = 10010, M = 86410;
int dp[2][M];
struct COWS {
    int s; int e; int pay;
}cows[N];
int n,m,e;

bool cmp(const struct COWS& a, const struct COWS& b) {
    return a.s < b.s;
}


int main()
{
    //cin >> n >> m >> e;
    scanf("%d%d%d",&n,&m,&e);
    m++; e++;
    for (int i = 1; i <= n; i++) {
        //cin >> cows[i].s >> cows[i].e >> cows[i].pay;
        scanf("%d%d%d", &cows[i].s , &cows[i].e , &cows[i].pay);
        cows[i].s++; cows[i].e++;
    }

    sort(cows + 1, cows + 1 + n,cmp);

    memset(dp, 0x3f, sizeof dp);
    dp[0][m-1] = 0;
    
    int prev = 0; int curr = 1;

    for (int i = 1; i <= n; i++) {
        int start = cows[i].s; int end = cows[i].e; int pay = cows[i].pay;
        memcpy(dp[curr], dp[prev], sizeof(dp[0][0]) * M);
        for (int j = start-1; j <= end; j++) {
            dp[curr][end] = min(dp[curr][end], dp[prev][j] + pay);
        }
        swap(curr, prev);
    }

    //cout << dp[prev][e] << endl;
    printf("%d\n",dp[prev][e]);

    return 0;
}

